﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SGCC.Models;
using System.Linq.Expressions;
using System.Linq.Dynamic;
using System.Data.Common;

namespace SGCC.Controllers
{
    public class FuncionarioController : Controller
    {

        public ActionResult Index()
        {
            using (DBContext db = new DBContext())
            {
                var funcionarios = from f in db.Funcionario
                                   join e in db.Especialidade on f.EspecialidadeId equals e.EspecialidadeId
                                   join c in db.Cidade on f.CidadeId equals c.CidadeId
                                   join uf in db.Estado on f.EstadoId equals uf.EstadoId
                                   where (f.Ativo == "S")
                                   orderby f.Nome ascending
                                   select new FuncionarioConsulta
                                   {
                                       Id = f.FuncionarioId,
                                       Nome = f.Nome,
                                       CPF = f.CPF,
                                       DataNasc = f.DataNasc,
                                       Telefone = f.Telefone,
                                       Especialidade = e.Nome,
                                       Cidade = c.Nome,
                                       UF = uf.Sigla,
                                       Logradouro = f.Logradouro
                                   };

                ViewBag.resultado = funcionarios.ToList();
            }

            return View();
        }

        public ActionResult AdicionarFuncionario()
        {
            return View();
        }

        [HttpPost]
        public ActionResult AdicionarFuncionario(FuncionarioModel funcionario)
        {
            if (ModelState.IsValid)
            {
                funcionario.AdicionarFuncionario(funcionario);
                ViewBag.sucesso = "Funcionário adicionado com sucesso";
                ModelState.Clear();
            }
            else
            {
                ViewBag.alerta = "Preencha todos os campos obrigatórios*";
            }
            
            return View();
        }

        public ActionResult Editar(int id)
        {
            FuncionarioModel fm = null;

            using (DBContext db = new DBContext())
            {
                Funcionario f = db.Funcionario.FirstOrDefault(x => x.FuncionarioId == id);
                fm = new FuncionarioModel(f);
            }

            return View(fm);
        }

        [HttpPost]
        public ActionResult Editar(FuncionarioModel funcionario)
        {
            if (ModelState.IsValid)
            {
                using (DBContext db = new DBContext())
                {
                    Funcionario f = db.Funcionario.FirstOrDefault(x => x.FuncionarioId == funcionario.Id);
                    f.Nome = funcionario.nome;
                    f.CPF = funcionario.cpf;
                    f.Telefone = funcionario.telefone;
                    f.CidadeId = funcionario.cidadeId;
                    f.EstadoId = funcionario.estadoId;
                    f.EspecialidadeId = funcionario.especialidadeId;
                    f.Logradouro = funcionario.logradouro;
                    f.Ativo = "S";
                    f.DataNasc = funcionario.dataNasc;

                    db.SaveChanges();
                }

                ViewBag.sucesso = "Funcionário salvo com sucesso";
            }
            else
            {
                ViewBag.alerta = "Preencha todos os campos obrigatórios*";
            }

            return View(funcionario);
        }

        public ActionResult Desativar(int id)
        {

            using (DBContext db = new DBContext())
            {
                Funcionario f = db.Funcionario.FirstOrDefault(x => x.FuncionarioId == id);
                f.Ativo = "N";

                db.SaveChanges();
            }

            ViewBag.resultado = new FuncionarioModel().ListarFuncionarios();
            return View("index");
        }

        [HttpPost]
        public ActionResult BuscarFuncionario(FiltroFuncionario filtro)
        {
            List<FuncionarioConsulta> consulta = new List<FuncionarioConsulta>();

            using (DBContext db = new DBContext())
            {
                db.Database.Connection.Open();

                DbCommand cmd = db.Database.Connection.CreateCommand();
                
                cmd.CommandText = "select "+
                                  "f.FuncionarioId, " +
                                  "f.Nome, " +
                                  "f.Cpf, " +
                                  "f.DataNasc, " +
                                  "f.Telefone, " +
                                  "f.Logradouro, " +
                                  "e.Nome, " +
                                  "c.Nome, " +
                                  "u.Sigla " +
                                  "from Funcionario f " +
                                  "inner join Especialidade e on e.EspecialidadeId = f.EspecialidadeId " +
                                  "inner join Cidade c on c.CidadeId = f.CidadeId " +
                                  "inner join Estado u on u.EstadoId = c.EstadoId ";

                string where = string.Empty;

                if (!string.IsNullOrWhiteSpace(filtro.Nome))
                {
                    where = string.Format("f.Nome like '%{0}%'", filtro.Nome);
                }

                if (!string.IsNullOrWhiteSpace(filtro.CPF))
                {
                    if (!string.IsNullOrWhiteSpace(where))
                        where += "and ";

                    where += string.Format("f.CPF like '%{0}%'", filtro.Nome);
                }

                if (!string.IsNullOrWhiteSpace(filtro.Logradouro))
                {
                    if (!string.IsNullOrWhiteSpace(where))
                        where += "and ";

                    where += string.Format("f.Logradouro like '%{0}%'", filtro.Logradouro);
                }

                if (filtro.Especialidade > 0)
                {
                    if (!string.IsNullOrWhiteSpace(where))
                        where += "and ";

                    where += string.Format("f.EspecialidadeId = {0}", filtro.Especialidade);
                }

                if (filtro.Cidade > 0)
                {
                    if (!string.IsNullOrWhiteSpace(where))
                        where += "and ";

                    where += string.Format("c.CidadeId = {0}", filtro.Cidade);
                }

                if (filtro.Estado > 0)
                {
                    if (!string.IsNullOrWhiteSpace(where))
                        where += "and ";

                    where += string.Format("u.EstadoId = {0}", filtro.Estado);
                }

                if (!string.IsNullOrWhiteSpace(where))
                    cmd.CommandText += " where " + where;

                DbDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    consulta.Add(new FuncionarioConsulta
                    {
                        Id = Convert.ToInt32(reader[0]),
                        Nome = reader[1].ToString(),
                        CPF = reader[2].ToString(),
                        DataNasc = Convert.ToDateTime(reader[3]),
                        Telefone = reader[4].ToString(),
                        Logradouro = reader[5].ToString(),
                        Especialidade = reader[6].ToString(),
                        Cidade = reader[7].ToString(),
                        UF = reader[8].ToString()
                    });
                }
            }

            ViewBag.resultado = consulta;

            filtro.Especialidade = 0;
            filtro.Cidade = 0;
            filtro.Estado = 0;

            return View("Index", filtro);
        }
    }
}
